雖然做完 CI 之後直接做 CD 非常方便,但是在透過 AWS CloudFormation 部署 infra 的過程中,如果有錯誤的話, error log 往往會埋在 Gitlab 和 github 等工具裡面難以除錯,而且這些工具也會有 timeout 的問題。有的時候如果 script 沒有寫好,雖然 status 顯示 success ,但卻沒有部署成功,也會造成很多誤會,所以今天要來介紹如何使用 AWS CodePipeline 啟動 CloudFormation 部署 AWS resource ,讓我們可以更容易 debug 部署過程中的問題。
如果要從 AWS console 新增 CodePipeline ,可以到 CodePipeline 的 console 按下 Create pipeline
,進入新增 pipeline 的頁面。
進入新增 pipeline 的頁面後,可以選擇用 template 產生後面的 pipeline ,或者自己設定 pipeline 。這篇文章選擇 Build custom pipeline
,一步一步自行設定每個 stage 。
在設定每個 stage 要做的事之前,先設定 pipeline 的 setting ,必須填寫name,和選擇要用什麼 IAM role 去執行後面的 pipeline 。
接著選擇 artifact 的來源,如果選的來源不是 AWS 的 resource ,會需要登入驗正,如果是選擇 CodeCommit 、 ECR 或 S3 ,則會需要指定這些服務底下的 resource 。
以 S3 為例,選了之後 pipeline 會列出 S3 bucket 的清單,指定好其中的一個 S3 bucket 之後,在指定 artifact 的 Object key , artifact 需要包成 zip 檔,並且把 CloudFormation 的 yaml 檔和相關程式碼放在裡面。
接下來到 build stage ,如果已經在 CI 的時候把程式碼事先 build 好,這個 stage 是可以 skip 掉。
然後往 deploy stage 前進, provider 選擇 CloudFormation ,並指定要把 infra 部署到哪個 region ,因為這次部署是要新增一個 stack 進行部署,所以 Action mode
選擇 Create or Update a stack
, Stack name
會出現該 region 所有 stack 的清單。
因為是新增一個 stack ,所以沒有從清單裡面選現有的 stack ,而是直接給一個新的名稱。然後填寫 template 的名稱, template 會被包在 source stage 上傳的 zip 檔中,把檔案名稱填上去即可。
最後指定要用哪個 role 來啟動 CloudFormation 部署 infra,這邊要特別注意,這個 role 需要有 CloudFormation template 中,要操作的 AWS resource 的權限,不然在 CloudFormation 部署 AWS resource 時會因為權限不足,導致部署失敗。
Review完就可以新增pipeline了!
今天知道怎麼一步一步透過 CodePipeline 和 CloudFormation 部署 infra 到 AWS 上,明天會來測試部署的結果,以及遇到錯誤時,可以看哪些 log 幫忙除錯。
medium: 運用CodePipeline部署CloudFormation